#!/usr/bin/env node

/**
 * 微信小程序上传命令行工具
 *
 * 使用方法:
 * node scripts/upload-miniprogram.js --project=<projectId> --appid=<authAppid> [选项]
 *
 * 选项:
 * --project=<projectId>    项目ID (必填)
 * --appid=<authAppid>      授权小程序appid (必填)
 * --version=<version>      版本号 (可选,默认自动生成)
 * --desc=<description>     版本描述 (可选)
 * --preview                生成预览二维码而不是上传
 * --batch=<appid1,appid2>  批量上传多个appid (逗号分隔)
 *
 * 示例:
 * # 上传单个小程序
 * node scripts/upload-miniprogram.js --project=abc123 --appid=wxXXXXXXXXXX --version=1.0.0
 *
 * # 生成预览二维码
 * node scripts/upload-miniprogram.js --project=abc123 --appid=wxXXXXXXXXXX --preview
 *
 * # 批量上传
 * node scripts/upload-miniprogram.js --project=abc123 --batch=appid1,appid2,appid3
 */

const axios = require('axios');

// 解析命令行参数
function parseArgs() {
  const args = {};
  process.argv.slice(2).forEach(arg => {
    if (arg.startsWith('--')) {
      const [key, value] = arg.substring(2).split('=');
      args[key] = value || true;
    }
  });
  return args;
}

// API 客户端
const BASE_URL = process.env.API_URL || 'http://localhost:9999';
const api = axios.create({
  baseURL: BASE_URL,
  headers: {
    'Content-Type': 'application/json'
  }
});

// 打印帮助信息
function printHelp() {
  console.log(`
微信小程序上传命令行工具

使用方法:
  node scripts/upload-miniprogram.js --project=<projectId> --appid=<authAppid> [选项]

必填参数:
  --project=<projectId>    项目ID
  --appid=<authAppid>      授权小程序appid (或使用 --batch)

可选参数:
  --version=<version>      版本号 (默认自动生成)
  --desc=<description>     版本描述
  --preview                生成预览二维码而不是上传
  --batch=<appids>         批量上传多个appid (逗号分隔)
  --robot=<number>         机器人编号 1-30 (默认1)

环境变量:
  API_URL                  API服务器地址 (默认 http://localhost:9999)

示例:
  # 上传单个小程序
  node scripts/upload-miniprogram.js --project=abc123 --appid=wxXXXXXXXXXX --version=1.0.0

  # 生成预览二维码
  node scripts/upload-miniprogram.js --project=abc123 --appid=wxXXXXXXXXXX --preview

  # 批量上传
  node scripts/upload-miniprogram.js --project=abc123 --batch=appid1,appid2,appid3 --version=1.0.0
  `);
}

// 上传小程序
async function uploadMiniprogram(args) {
  const { project, appid, version, desc, robot } = args;

  console.log('📱 开始上传小程序...');
  console.log('项目ID:', project);
  console.log('授权AppID:', appid);

  try {
    const response = await api.post('/api/miniprogram/upload', {
      projectId: project,
      authAppid: appid,
      version: version || undefined,
      desc: desc || `命令行上传 - ${new Date().toLocaleString('zh-CN')}`,
      robot: robot ? parseInt(robot) : 1
    });

    if (response.data.success) {
      console.log('\n✅ 上传成功!');
      console.log('版本:', response.data.data.version);
      console.log('描述:', response.data.data.desc);
      console.log('\n请登录微信公众平台查看上传结果');
    } else {
      console.error('\n❌ 上传失败:', response.data.message);
      process.exit(1);
    }
  } catch (error) {
    console.error('\n❌ 上传失败:', error.response?.data?.message || error.message);
    process.exit(1);
  }
}

// 生成预览二维码
async function previewMiniprogram(args) {
  const { project, appid } = args;

  console.log('🔍 生成预览二维码...');
  console.log('项目ID:', project);
  console.log('授权AppID:', appid);

  try {
    const response = await api.post('/api/miniprogram/preview', {
      projectId: project,
      authAppid: appid
    });

    if (response.data.success) {
      console.log('\n✅ 预览二维码生成成功!');
      console.log('二维码URL:', `${BASE_URL}${response.data.data.qrcodeUrl}`);
      console.log('\n请使用微信扫描二维码预览小程序');
    } else {
      console.error('\n❌ 生成失败:', response.data.message);
      process.exit(1);
    }
  } catch (error) {
    console.error('\n❌ 生成失败:', error.response?.data?.message || error.message);
    process.exit(1);
  }
}

// 批量上传
async function batchUpload(args) {
  const { project, batch, version, desc } = args;
  const appids = batch.split(',').map(id => id.trim());

  console.log('📱 批量上传小程序...');
  console.log('项目ID:', project);
  console.log('授权AppID列表:', appids.join(', '));

  try {
    const response = await api.post('/api/miniprogram/batch-upload', {
      projectId: project,
      authAppids: appids,
      version: version || undefined,
      desc: desc || `批量命令行上传 - ${new Date().toLocaleString('zh-CN')}`
    });

    if (response.data.success) {
      console.log('\n✅ 批量上传完成!');
      console.log(`成功: ${response.data.data.successCount} 个`);
      console.log(`失败: ${response.data.data.failCount} 个`);
      console.log('\n详细结果:');
      response.data.data.results.forEach((result, index) => {
        const status = result.success ? '✅' : '❌';
        console.log(`  ${index + 1}. ${status} ${result.appid}`);
      });
    } else {
      console.error('\n❌ 批量上传失败:', response.data.message);
      process.exit(1);
    }
  } catch (error) {
    console.error('\n❌ 批量上传失败:', error.response?.data?.message || error.message);
    process.exit(1);
  }
}

// 主函数
async function main() {
  const args = parseArgs();

  // 显示帮助信息
  if (args.help || args.h) {
    printHelp();
    return;
  }

  // 检查必填参数
  if (!args.project) {
    console.error('❌ 错误: 缺少 --project 参数');
    printHelp();
    process.exit(1);
  }

  console.log('\n==========================================');
  console.log('    微信小程序上传工具');
  console.log('==========================================');
  console.log('API地址:', BASE_URL);
  console.log('==========================================\n');

  try {
    // 批量上传
    if (args.batch) {
      await batchUpload(args);
    }
    // 预览
    else if (args.preview) {
      if (!args.appid) {
        console.error('❌ 错误: 预览模式需要 --appid 参数');
        process.exit(1);
      }
      await previewMiniprogram(args);
    }
    // 单个上传
    else {
      if (!args.appid) {
        console.error('❌ 错误: 上传模式需要 --appid 参数');
        process.exit(1);
      }
      await uploadMiniprogram(args);
    }
  } catch (error) {
    console.error('\n❌ 执行失败:', error.message);
    process.exit(1);
  }

  console.log('\n==========================================');
  console.log('    完成');
  console.log('==========================================\n');
}

// 运行主函数
main().catch(error => {
  console.error('执行失败:', error);
  process.exit(1);
});
